<?php
/**
* @file DataService.php
* Copyright (c) Friends Group. All rights reserved.
* $Id$
*
*/

require_once(realpath(dirname(__FILE__)) . '/../config.php');
require_once(realpath(dirname(__FILE__)) . '/interfaces/IDataService.php');
require_once(realpath(dirname(__FILE__)) . '/common/dbclass.php');

class DataService implements IDataService 
{
    private $db;
    
    public function __construct()
    {
        $this->db = new dbClass(DB_USER, DB_PASS, DB_NAME, DB_HOST);
        //$dbCon->showError(false)';
    }
    
    /**
     * @ReturnType void
     * @ParamType object 
     * @ParamType objectType 
     * Insert dữ liệu mới vào database
     */
    public function create(&$object) 
    {
        if($object == null)
            throw new Exception("Tham số object không hợp lệ.");
        
        try
        {
            $tableName = get_class($object);
        }
        catch(Exception $ex) {
            throw new Exception($ex->getMessage());
        }
        
        $data = $object->getData();
        
        if(count($data))
            $this->db->insert($tableName, $data);
        
        if($object->hasProperty("ID"))
            $object->setID($this->db->getLastInsertID());
    }

    /**
     * @ReturnType void
     * @ParamType object 
     * @ParamType objectType 
     * Xóa dữ liệu trong database
     */
    public function delete($object, $where = null) 
    {
        if($object == null)
            throw new Exception("Tham số object không hợp lệ.");
       
        try
        {
            $tableName = get_class($object);
        }
        catch(Exception $ex) {
            throw new Exception($ex->getMessage());
        }
        
        if($where == null)
            $where = array("id" => "{$object->getID()}");
        
        $this->db->delete($tableName, $where);
    }

    /**
     * @ReturnType void
     * @ParamType object 
     * @ParamType objectType 
     * Cập nhât database
     */
    public function update($object, $where = null) 
    {
        if($object == null)
            throw new Exception("Tham số object không hợp lệ.");
        
        try
        {
            $tableName = get_class($object);
        }
        catch(Exception $ex) {
            throw new Exception($ex->getMessage());
        }
        
        $data = $object->getData();
        
        if($where == null)
            $where = array("id" => "{$object->getID()}");
        
        $this->db->update($tableName, $data, $where);
    }

    /**
     * @ReturnType Object
     * @ParamType queryString 
     * @ParamType objectType 
     * Lấy danh sách các dữ liệu thỏa mãn queryString trong table objectType
     */
    public function getList($queryString, $objectType) 
    {
        $result = $this->db->getResults($queryString);
        $objs = array();
        
        if(count($result))
        {
            foreach ($result as $item)
            {
                $obj = new $objectType();
                $objs[] = $obj ->fromArray($item);
            }
            return $objs;
        }
        return null;
    }

    /**
     * @ReturnType Object
     * @ParamType queryString 
     * @ParamType objectType 
     * Lấy dữ liệu đầu tiên thỏa mãn queryString, trả về đối tượng có kiểu objectType, hàm này chỉ trả về 1 object duy nhất
     */
    public function getFirst($queryString, $objectType) 
    {
        $result = $this->db->getRow($queryString);
        $obj = new $objectType();
        
        if(count($result))
        {
            $obj ->fromArray($result);
            return $obj;
        }
        return null;
    }
    /**
     * @ReturnType Object
     * @ParamType id 
     * @ParamType objectType 
     * Lấy dữ liệu theo id
     */
    //xunglv
    public function getById($id, $objectType) 
    {
        $result = $this->db->getRow("select * from $objectType where $objectType.id=$id");
        $obj = new $objectType();
        if (count($result))
        {
            $obj->fromArray($result);
            return $obj;
        }
        return null;
    }
}

?>